﻿using _6_Decorator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _6_Decorator
{
    class Program
    {
        /*
         装饰者模式： 是为已有功能动态添加更多功能的一种方式。
         * 当系统需要新功能时，向旧的类中添加新的代码。这些新的代码通常装饰了原有类的核心职责或主要行为。
         * 在主类中添加了新的方法新的逻辑从而增加了主类的复杂度。
         * 这些新加入的逻辑等仅仅是为了满足一些只在特定情况才执行的的特殊行为。

         装配者模式提供了对这些逻辑组织的一个非常好的解决方案。 他把每个要装饰的功能放在单独类中，并让这
         个类包装它所要装饰的对象，因此，当需要执行特殊行为时，客户代码就可以运行时更具需要有选择的，按顺
         序的使用装饰供呢个包装对象。

        装饰模式的优点：把类中的装饰功能从类中搬移，简化原有的类 ； 有效的吧类的核心职责和装饰功能区分开了,
        同时可以去除相关类中重复的装饰逻辑。

        要注意的是装饰模式的顺序很重要：比如加密数据和过滤词汇都可以是数据持久化前的装饰功能。但是先加密了数
        据在用过滤功能就会出现问题。 最理想的情况是保证装饰类之间彼此独立
         */
        static void Main(string[] args)
        {
            //ConcreteComponent c = new ConcreteComponent(); //装饰操作
            //ConcreterDecoratorA d1 = new ConcreterDecoratorA(); //装饰操作对象A
            //ConcreterDecoratorB d2 = new ConcreterDecoratorB(); //装饰操作对象B

            //d1.SetComponent(c);
            //d2.SetComponent(d1);
            //d2.Operation();
            //Console.Read();

            /*=====================================================================*/
            /*
             * 装饰者 将对象的逻辑进行封装然后 将业务进行装配。 多用于多变组合的业务代码
             * 通过继承对象间的持有引用实现相同的抽象组合逻辑
             */

            Persion self = new Persion("自己");
            TShirts tShirt = new TShirts();
            BigTrouser bigTrouser = new BigTrouser();
            TrackShoes trackShoes = new TrackShoes();
            Jeans jeans = new Jeans();

            Console.WriteLine("装饰一:");
            tShirt.SetComponent(bigTrouser);
            trackShoes.SetComponent(tShirt);
            trackShoes.Show();
            self.Show(); //装饰的过程 一个一个的装饰

            Console.WriteLine("装饰二:");
            tShirt.SetComponent(jeans);
            trackShoes.SetComponent(tShirt);
            trackShoes.Show();
            Console.Read();
        }
    }
}
